package com.itheima.marking_system.utils.zip;

import com.itheima.marking_system.pojo.common.R;
import com.itheima.marking_system.pojo.entity.RegionEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

@Slf4j

public class ZipUtils {



    /**
     * 将 MultipartFile 转换为 File
     *
     * @param file 上传的 MultipartFile 对象
     * @return 转换后的 File 对象
     * @throws RuntimeException 如果转换过程中发生 IO 异常
     */
    public static File toFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("文件不能为空");
        }

        File tempFile = null;
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));

        try {
            // 创建临时文件
            tempFile = File.createTempFile("temp", suffix);
            tempFile.deleteOnExit();
        } catch (IOException e) {
            throw new RuntimeException("创建临时文件失败", e);
        }

        try (InputStream inputStream = file.getInputStream();
             FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {

            // 从输入流中读取数据并写入输出流
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            throw new RuntimeException("文件转换失败", e);
        }

        return tempFile;
    }

    /**
     * 将 MultipartFile 转换为 byte[]
     *
     * @param tempFile 上传的 File 对象
     * @return 转换后的 byte[] 对象
     * @throws RuntimeException 如果转换过程中发生 IO 异常
     */
    public static byte[] setBytes(File tempFile) {
        // 使用Paths.get方法根据传入的文件路径字符串创建一个Path对象
        Path path = tempFile.toPath();
        // 使用Files.readAllBytes方法读取Path对象指向的文件的所有字节，并返回一个包含这些字节的数组
        try {
            return Files.readAllBytes(path);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 将二进制数组写入到指定的文件中。
     *
     * @param binaryArray 要写入的二进制数组。
     * @param filePath    目标文件的路径。
     * @throws IOException 如果发生I/O错误，则抛出此异常。
     */

    public static String writeBytes(byte[] binaryArray, String filePath) throws IOException {
        // 使用try-with-resources语句确保FileOutputStream在操作完成后正确关闭
        try (FileOutputStream fos = new FileOutputStream(new File(filePath))) {
            // 将二进制数组写入到文件中
            fos.write(binaryArray);
            System.out.println("成功写入文件: " + filePath);
        } catch (IOException e) {
            System.err.println("写入文件失败: " + filePath);
            e.printStackTrace();
            throw e;
        }
        return filePath;
    }


}




